/*
* leetcode 3240. 最少翻转次数使二进制矩阵回文 II
*
给你一个 m x n 的二进制矩阵 grid 。
如果矩阵中一行或者一列从前往后与从后往前读是一样的，那么我们称这一行或者这一列是 回文 的。
你可以将 grid 中任意格子的值 翻转 ，也就是将格子里的值从 0 变成 1 ，或者从 1 变成 0 。
请你返回 最少 翻转次数，使得矩阵中 所有 行和列都是 回文的 ，且矩阵中 1 的数目可以被 4 整除 。
/*
* */
import java.util.*;
class Solution {
    public int minFlips(int[][] grid) {
        int n=grid.length,m=grid[0].length;
        int index=0,right=m-1,down=n-1,rd=0,ret=0;
        for(int i=0;i<n/2;i++){
            for(int j=0;j<m/2;j++){
                //分别记录值为 0,1的个数
                int[] ans={0,0};
                ans[grid[i][j]]++;
                ans[grid[i][m-1-j]]++;
                ans[grid[n-1-i][j]]++;
                ans[grid[n-1-i][m-1-j]]++;
                ret+=Math.min(ans[0],ans[1]);
            }
        }
        int[] ans={0,0,0};
        //分类讨论 行或列为奇数时,对称位置和为 0,1,2的位置
        if((n&1)==1){
            for(int i=0;i<m/2;i++){
                ans[grid[n/2][i]+grid[n/2][m-1-i]]++;
            }
        }
        if((m&1)==1){
            for(int i=0;i<n/2;i++){
                ans[grid[i][m/2]+grid[n-1-i][m/2]]++;
            }
        }
        if((m&n&1)==1)ret+=grid[n/2][m/2];
        //和为1的位置是不对称的,一定要修改
        ret+=ans[1];
        //如果和为2的对称点个数为奇数,并且没有不对称点能够变为1来补充1的个数
        //就会导致 最终1的个数不为4的倍数.所以必须补充2次操作才行
        if(ans[1]==0&&(ans[2]&1)==1)ret+=2;
        return ret;
    }
}